package com.wyp168.juc.threadpool;

import org.apache.tomcat.util.threads.TaskThreadFactory;

import java.util.concurrent.*;

/**
 * @ClassName ThreadPoolDeom001
 * @Description TODO
 * @Author wyp168
 * @Date 2022/9/11 11:31
 */
public class ThreadPoolDemo001 {
    public static final int CORE_POOL_SIZE = 5;     //核心线程数（默认情况下，核心线程会一直存活下去）
    public static final int MAXIMUM_POOL_SIZE = 8;  //线程池中最大所能容纳的线程数
    public static final long KEEP_ALIVE = 10;       //闲置线程最大超时时间
    //任务队列。通过调用Executors.execute()方法执行的异步任务都会放到该队列中，这是一个阻塞队列。
    //下面的操作翻译成是：创建一个初始化值为5的ArrayBlockingQueue阻塞
    public static final BlockingQueue<Runnable> WORK_QUEUE = new ArrayBlockingQueue<>(5);
    //设置该线程池创建线程的方式
    /**
     * 三个参数的含义分别为：
     *  namePrefix： 线程名前缀
     *  daemon： 是否设置为守护线程
     *  priority： 线程的优先级
     */
    public static final ThreadFactory THREAD_FACTORY = new TaskThreadFactory("diy-thread", false, 5);
    //拒绝策略。设置当线程池的线程数量达到最大值时需要执行的饱和策略
    /**
     * AbortPolicy： 默认拒绝策略，拒绝任务并抛出任务
     * CallerRunsPolicy： 使用调用线程直接运行任务
     * DiscardPolicy： 直接拒绝任务，不抛出错误
     * DiscardOldestPolicy： 触发拒绝策略，只要还有任务新增，一直会丢弃阻塞队列的最老的任务，并将新的任务加入
     */
    public static final RejectedExecutionHandler HANDLE = new ThreadPoolExecutor.AbortPolicy();
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
                                                                    MAXIMUM_POOL_SIZE,
                                                                    KEEP_ALIVE,
                                                                    TimeUnit.SECONDS,   //超时时间单位
                                                                    WORK_QUEUE,
                                                                    THREAD_FACTORY,
                                                                    HANDLE
                );
        Future<String> future = threadPoolExecutor.submit(() -> {
            System.out.println("Runnable Interface running~~");
        }, "abc");
        System.out.println(future.get()); //get方法会阻塞线程
        threadPoolExecutor.shutdown();  //使用完数据资源之后需要释放资源，否则可能会出现内存溢出问题
    }
}
